// Name:                     Mixins
// Description:              Less mixins for Amaze UI
//
// ========================================================================


// Utilities
// ========================================================================

// Micro clear fix
// via: http://nicolasgallagher.com/micro-clearfix-hack/

.clearfix() {
  &:before,
  &:after {
    content: " ";
    display: table;
  }

  &:after {
    clear: both;
  }

  // old IE support
  // *zoom: 1;
}


// WebKit-style focus

.tab-focus() {
  // Default
  outline: thin dotted #333;
  // WebKit
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}


// Center-align a block level element

.center-block() {
  display: block;
  margin-left: auto;
  margin-right: auto;
}


// Sizing shortcuts

.size(@width; @height) {
  width: @width;
  height: @height;
}


.square(@size) {
  .size(@size; @size);
}


// Placeholder text

.placeholder(@color: @input-color-placeholder) {
  &:-moz-placeholder            { color: @color; } // Firefox 4-18
  &::-moz-placeholder           { color: @color; } // Firefox 19+
  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+
  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome
}


// Text overflow
// Requires inline-block or block for proper styling

.text-overflow(@display: block;){
  display: @display;
  word-wrap: normal; /* for IE */
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}


// CSS image replacement
// via: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757

.text-hide() {
  font: ~"0/0" a;
  color: transparent;
  text-shadow: none;
  background-color: transparent;
  border: 0;
}


// Line clamp
// http://dropshado.ws/post/1015351370/webkit-line-clamp

.am-line-clamp(@lines, @line-height: 1.3em) {
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines; // number of lines to show
  overflow: hidden;
  line-height: @line-height;
  max-height: @line-height * @lines;
}



// CSS3 PROPERTIES
// --------------------------------------------------

// Single side border-radius
.border-top-radius(@radius) {
  border-top-right-radius: @radius;
  border-top-left-radius: @radius;
}
.border-right-radius(@radius) {
  border-bottom-right-radius: @radius;
  border-top-right-radius: @radius;
}
.border-bottom-radius(@radius) {
  border-bottom-right-radius: @radius;
  border-bottom-left-radius: @radius;
}
.border-left-radius(@radius) {
  border-bottom-left-radius: @radius;
  border-top-left-radius: @radius;
}

// Drop shadows
.box-shadow(@shadow) {
  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 & bb7.0
  box-shadow: @shadow;
}

// Transitions
.transition(@transition) {
  -webkit-transition: @transition;
  transition: @transition;
}
.transition-property(@transition-property) {
  -webkit-transition-property: @transition-property;
  transition-property: @transition-property;
}
.transition-delay(@transition-delay) {
  -webkit-transition-delay: @transition-delay;
  transition-delay: @transition-delay;
}
.transition-duration(@transition-duration) {
  -webkit-transition-duration: @transition-duration;
  transition-duration: @transition-duration;
}
.transition-transform(@transition) {
  -webkit-transition: -webkit-transform @transition;
  -moz-transition: -moz-transform @transition;
  -o-transition: -o-transform @transition;
  transition: transform @transition;
}


// Transformations
// ------------------------------------------------------------------------

.rotate(@degrees) {
  -webkit-transform: rotate(@degrees);
  -ms-transform: rotate(@degrees); // IE9+
  transform: rotate(@degrees);
}

.scale(@ratio) {
  -webkit-transform: scale(@ratio);
  -ms-transform: scale(@ratio); // IE9+
  transform: scale(@ratio);
}

.translate(@x; @y) {
  -webkit-transform: translate(@x, @y);
  -ms-transform: translate(@x, @y); // IE9+
  transform: translate(@x, @y);
}

.skew(@x; @y) {
  -webkit-transform: skew(@x, @y);
  -ms-transform: skewX(@x) skewY(@y); // IE9+
  transform: skew(@x, @y);
}

.translate3d(@x:0, @y:0, @z:0) {
  -webkit-transform: translate3d(@x,@y,@z);
  -ms-transform: translate3d(@x,@y,@z);
  transform: translate3d(@x,@y,@z);
}

.rotateX(@degrees) {
  -webkit-transform: rotateX(@degrees);
  -ms-transform: rotateX(@degrees); // IE9+
  transform: rotateX(@degrees);
}

.rotateY(@degrees) {
  -webkit-transform: rotateY(@degrees);
  -ms-transform: rotateY(@degrees); // IE9+
  transform: rotateY(@degrees);
}

.perspective(@perspective) {
  -webkit-perspective: @perspective;
  -moz-perspective: @perspective;
  perspective: @perspective;
}
.perspective-origin(@perspective) {
  -webkit-perspective-origin: @perspective;
  -moz-perspective-origin: @perspective;
  perspective-origin: @perspective;
}

.transform(@tramsform) {
  -webkit-transform: @tramsform;
  -ms-transform: @tramsform;
  transform: @tramsform;
}

.transform-origin(@origin) {
  -webkit-transform-origin: @origin;
  -ms-transform-origin: @origin;
  transform-origin: @origin;
}


// Animations
// ========================================================================

.animation(@animation) {
  -webkit-animation: @animation;
  animation: @animation;
}


// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden`

.backface-visibility(@visibility){
  -webkit-backface-visibility: @visibility;
  -moz-backface-visibility: @visibility;
  backface-visibility: @visibility;
}


// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
  -moz-box-sizing: @boxmodel;
  box-sizing: @boxmodel;
}


// User select
// For selecting text on the page
// Formal syntax: none | text | all | element

.user-select(@select) {
  -webkit-user-select: @select;
  -moz-user-select: @select;
  -ms-user-select: @select; // IE10+
  -o-user-select: @select;
  user-select: @select;
}


// Resize anything

.resizable(@direction) {
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}


// CSS3 Content Columns

.content-columns(@column-count; @column-gap: @grid-gutter-width) {
  -webkit-column-count: @column-count;
  -moz-column-count: @column-count;
  column-count: @column-count;
  -webkit-column-gap: @column-gap;
  -moz-column-gap: @column-gap;
  column-gap: @column-gap;
}


// Optional hyphenation

.hyphens(@mode: auto) {
  word-wrap: break-word;
  -webkit-hyphens: @mode;
  -moz-hyphens: @mode;
  -ms-hyphens: @mode; // IE10+
  -o-hyphens: @mode;
  hyphens: @mode;
}


// Opacity

.opacity(@opacity) {
  opacity: @opacity;
}



// GRADIENTS
// ========================================================================

#gradient {
  // Horizontal gradient, from left to right
  //
  // Creates two color stops, start and end, by specifying a color and position for each color stop.
  // Color stops are not available in IE9 and below.
  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
    background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
  }

  // Vertical gradient, from top to bottom
  //
  // Creates two color stops, start and end, by specifying a color and position for each color stop.
  // Color stops are not available in IE9 and below.
  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
    background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1+, Chrome 10+
    background-image:  -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
  }

  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
    background-repeat: repeat-x;
    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+
    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10
  }

  .horizontal-3c(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
    background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    background-image: -moz-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
  }
  .vertical-3c(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color);
    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
  }
  //放射状
  .radial(@inner-color: #555; @outer-color: #333) {
    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color));
    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
    background-image: -moz-radial-gradient(circle, @inner-color, @outer-color);
    background-image: radial-gradient(circle, @inner-color, @outer-color);
    background-repeat: no-repeat;
  }

  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, @color), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, @color), color-stop(.75, @color), color-stop(.75, transparent), to(transparent));
    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    background-image: -moz-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
  }
}


// Reset filters for IE
//
// When you need to remove a gradient background, do not forget to use this to reset
// the IE filter for IE9 and below.
.reset-filter() {
  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}



// Retina images
//
// Short retina mixin for setting background-image and -size

.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
  background-image: url("@{file-1x}");

  @media
  only screen and (-webkit-min-device-pixel-ratio: 2),
  only screen and (   min--moz-device-pixel-ratio: 2),
  only screen and (     -o-min-device-pixel-ratio: 2/1),
  only screen and (        min-device-pixel-ratio: 2),
  only screen and (                min-resolution: 192dpi),
  only screen and (                min-resolution: 2dppx) {
    background-image: url("@{file-2x}");
    background-size: @width-1x @height-1x;
  }
}



.scrollable() {
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}



// Responsive image
//
// Keep images from scaling beyond the width of their parents.

.img-responsive(@display: block;) {
  display: @display;
  max-width: 100%; // Part 1: Set a maximum relative to the parent
  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
}


// ========================================================================
// Caret
// NOTE: If using ::before or ::after, `content: ""` is required
// ========================================================================

// Caret - down
// ------------------------------------------------------------------------

.caret-down(@size: 6px; @color:#222) {
  display: inline-block;
  width: 0;
  height: 0;
  vertical-align: middle;
  border-top:   @size solid @color;
  border-right: @size solid transparent;
  border-left:  @size solid transparent;
  border-bottom: 0 dotted;
  .rotate(360deg);
}


// Caret - up
// ------------------------------------------------------------------------

.caret-up(@size:6px; @color:#222) {
  display: inline-block;
  width: 0;
  height: 0;
  vertical-align: middle;
  border-bottom: @size solid @color;
  border-right: @size solid transparent;
  border-left:  @size solid transparent;
  border-top: 0 dotted;
  .rotate(360deg);
}


// Caret - down
// ------------------------------------------------------------------------

.caret-left(@size:6px; @color:#222) {
  display: inline-block;
  width: 0;
  height: 0;
  vertical-align: middle;
  border-right: @size solid @color;
  border-top: @size solid transparent;
  border-bottom:  @size solid transparent;
  border-left: 0 dotted;
  .rotate(360deg);
}

// Caret - down
// ------------------------------------------------------------------------

.caret-right(@size:6px; @color:#222) {
  display: inline-block;
  width: 0;
  height: 0;
  vertical-align: middle;
  border-left: @size solid @color;
  border-top: @size solid transparent;
  border-bottom:  @size solid transparent;
  border-right: 0 dotted;
  .rotate(360deg);
}



// CSS Arrow Mixin
//
// @param:  45deg (default) - right
//          135deg - down
//          -45deg - up
//          -135deg -left
// ------------------------------------------------------------------------

.arrow(@color:#DDD; @width:6px; @border-width: 2px; @deg: 45deg) {
  display: inline-block;
  width: @width;
  height: @width;
  border: @color solid;
  border-width: @border-width @border-width 0 0;
  .rotate(@deg);
}



// COMPONENT MIXINS
// --------------------------------------------------

// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@color: #e5e5e5) {
  height: 1px;
  margin: ((@line-height-computed / 2) - 1) 0;
  overflow: hidden;
  background-color: @color;
}



// Tables
// -------------------------
.table-row-variant(@state; @background; @border) {
  // Exact selectors below required to override `.table-striped` and prevent
  // inheritance to nested tables.
  .table > thead > tr,
  .table > tbody > tr,
  .table > tfoot > tr {
    > td.@{state},
    > th.@{state},
    &.@{state} > td,
    &.@{state} > th {
      background-color: @background;
      border-color: @border;
    }
  }

  // Hover states for `.table-hover`
  // Note: this is not available for cells or rows within `thead` or `tfoot`.
  .table-hover > tbody > tr {
    > td.@{state}:hover,
    > th.@{state}:hover,
    &.@{state}:hover > td,
    &.@{state}:hover > th {
      background-color: darken(@background, 5%);
      border-color: darken(@border, 5%);
    }
  }
}



// Button variants
// -------------------------

.button-variant(@color; @background; @border) {
  color: @color;
  background-color: @background;
  border-color: @border;

  &:hover,
  &:focus,
  &:active,
  &.am-active,
  .am-active .am-dropdown-toggle& {
    color: @color;
    background-color: darken(@background, 8%);
    border-color: darken(@background, 15%);
  }
  &:active,
  &.am-btn-active,
  .am-active .am-dropdown-toggle& {
    background-image: none;
  }
  &.am-disabled,
  &[disabled],
  fieldset[disabled] & {
    &,
    &:hover,
    &:focus,
    &:active,
    &.am-btn-active {
      background-color: @background;
      border-color: @border;
    }
  }

  // for `.am-btn-group`
  .am-btn-group &,
  .am-btn-group-stacked & {
    border-color: darken(@background, 5%);
  }
}


// Button size
// ========================================================================

.button-size(@font-size) {
  font-size: @font-size;
  // line-height: ensure proper height of button next to small input
  // line-height: @line-height;
}



// Pagination
// ========================================================================

.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
  > li {
    > a,
    > span {
      padding: @padding-vertical @padding-horizontal;
      font-size: @font-size;
    }
    &:first-child {
      > a,
      > span {
        .border-left-radius(@border-radius);
      }
    }
    &:last-child {
      > a,
      > span {
        .border-right-radius(@border-radius);
      }
    }
  }
}



// Form
// ========================================================================

// Form validation states

.form-field-validation(@text-color: #555; @border-color: #ccc) {
  // the label and help text color
  .am-form-help,
  .am-form-label,
  .am-radio,
  .am-checkbox,
  .am-radio-inline,
  .am-checkbox-inline  {
    color: @text-color;
  }

  .am-form-field  {
    border-color: @border-color!important;
    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
    &:focus {
      //background-color: rgba(red(@border-color), green(@border-color), blue(@border-color), .05) !important;
      background-color: @input-focus-bg;
      border-color: darken(@border-color, 10%);
      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 5px lighten(@border-color, 20%) !important;
      .box-shadow(@shadow) !important;
    }
  }

  // feedback icon
  [class*='am-icon-'] {
    color: @text-color;
  }
}


// Form element focus state

.form-field-focus(@color: @input-border-focus) {
  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
  &:focus {
    //background-color: rgba(red(@color), green(@color), blue(@color), .05);
    background: @input-focus-bg;
    border-color: @color;
    outline: 0;
    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
  }
}



// Retina image background
// ========================================================================

.retina-bgi(@file-1x; @file-2x; @width-1x; @height-1x) {
  background-image: url("@{file-1x}");

  @media
  only screen and (-webkit-min-device-pixel-ratio: 2),
  only screen and (   min--moz-device-pixel-ratio: 2),
  only screen and (     -o-min-device-pixel-ratio: 2/1),
  only screen and (        min-device-pixel-ratio: 2),
  only screen and (                min-resolution: 192dpi),
  only screen and (                min-resolution: 2dppx) {
    background-image: url("@{file-2x}");
    background-size: @width-1x @height-1x;
  }
}



// Panel mixin
// ========================================================================

.panel-variant(@border; @hd-text-color; @hd-bg-color; @hd-border) {
  border-color: @border;

  & > .am-panel-hd {
    color: @hd-text-color;
    background-color: @hd-bg-color;
    border-color: @hd-border;

    + .am-panel-collapse > .am-panel-bd {
      border-top-color: @border;
    }
  }
  & > .am-panel-footer {
    + .am-panel-collapse > .am-panel-bd {
      border-bottom-color: @border;
    }
  }
}



// Progress bar
// ========================================================================

.progress-bar-variant(@color) {
  background-color: @color;
  .am-progress-striped & {
    #gradient > .striped();
  }
}


// Font ICON
// ========================================================================

.am-icon-font() {
  display: inline-block; /* 1 */
  font-family: "FontAwesome";
  font-weight: normal; /* 2 */
  font-style: normal; /* 2 */
  vertical-align: baseline; /* 3 */
  line-height: 1; /* 4 */
  -webkit-font-smoothing: antialiased; /* 5 */
  -moz-osx-font-smoothing: grayscale;
}